package com.erp.ae.utils;

import com.sun.xml.bind.v2.TODO;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 图片添加水印
 */
public class ImageAddWatermarkUtils {


    public static InputStream addWatermark(String imageUrl, String content){
        // 判断content内容
        if(!content.startsWith("cn")){
            content = "YIDA Technology";
        }

        String imageAllName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
        String imageFileSuffix = imageUrl.substring(imageUrl.lastIndexOf(".") + 1);

        //待存储的地址
        String tarImgPath="D:\\" + imageAllName;
//        String tarImgPath = "/pb/tempic/" + imageAllName;

        InputStream inputStream = null;
        try{
            //创建一个URL对象,获取网络图片的地址信息（网络图片）
            URL url = new URL(imageUrl);
            //将URL对象输入流转化为图片对象 (url.openStream()方法，获得一个输入流)
            Image srcImg = ImageIO.read(url.openStream());
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);
//            System.out.println("图片的宽:"+srcImgWidth);
//            System.out.println("图片的高:"+srcImgHeight);


            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 加水印
            //创建画笔
            Graphics2D g = bufImg.createGraphics();
            //绘制原始图片
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //-------------------------文字水印 start----------------------------
            //根据图片的背景设置水印颜色
            g.setColor(new Color(255,255,255,128));
            //设置字体  画笔字体样式为微软雅黑，加粗，文字大小为60pt
            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            //设置水印的坐标(为原图片中间位置)
            int x=(srcImgWidth - getWatermarkLength(content, g)) / 2;
            int y=srcImgHeight / 2;
            //画出水印 第一个参数是水印内容，第二个参数是x轴坐标，第三个参数是y轴坐标
//            g.drawString(content, x, y);
//            g.drawString(content, x/3, y/3);
            g.drawString(content, x*5/3, y*5/3);
            g.dispose();
            //-------------------------文字水印 end----------------------------


            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, imageFileSuffix, outImgStream);
//            System.out.println("添加水印完成");
            outImgStream.flush();
            outImgStream.close();

        }catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try{
                if (inputStream != null) {
                    inputStream.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }

        }
        return convertImageByFile(tarImgPath);

    }

    private static InputStream convertImageByFile(String filePath) {

        // 创建对象
        File file = new File(filePath);

        FileInputStream fileInputStream = null;
        ByteArrayOutputStream bos = null;
        ByteArrayInputStream bis = null;
        try{
            // 创建文件输入流
            fileInputStream = new FileInputStream(file);

            bos = new ByteArrayOutputStream();

            // 将输入流转换为图片流
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fileInputStream.read(buffer)) != -1){
                bos.write(buffer, 0, bytesRead);
            }

            byte[] data = bos.toByteArray();
            bis = new ByteArrayInputStream(data);




        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                if(fileInputStream != null){
                    fileInputStream.close();
                }
                if(bos != null){
                    bos.close();
                }
                if(bis != null){
                    bis.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

        // 删除临时文件 TODO
        if (file.exists()) {
            boolean isDeleted = file.delete();

            if (isDeleted) {
//                System.out.println("文件已成功删除！");
            } else {
//                System.out.println("无法删除该文件。");
            }
        } else {
//            System.out.println("指定的文件不存在。");
        }
        return bis;
    }

    /**
     * 获取水印文字的长度
     * @param waterMarkContent
     * @param g
     * @return
     */
    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

    /**
     * 图片加水印
     *
     * @param inputStream   输入流
     * @param waterMarkName 添加水印的内容
     * @param fileSuffix    扩展名
     * @return InputStream 新的输入流
     */
    public static InputStream imgWatermarkInt(InputStream inputStream, String waterMarkName, String fileSuffix) {
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            BufferedImage originalImage = ImageIO.read(inputStream);
            int width = originalImage.getWidth();
            int height = originalImage.getHeight();

            if (width <= 0 || height <= 0) {
                throw new IllegalArgumentException("Invalid image size.");
            }

            if (waterMarkName == null || waterMarkName.trim().isEmpty()) {
                throw new IllegalArgumentException("Watermark name cannot be empty.");
            }

            // 创建新的BufferedImage对象，并复制原始图像
            BufferedImage newImage = new BufferedImage(width, height, originalImage.getType());
            Graphics2D g = newImage.createGraphics();
            g.drawImage(originalImage, 0, 0, null);

            int fontSize = (width + height) / 80;
            g.setFont(new Font("黑体", Font.PLAIN, fontSize));
            g.setColor(new Color(0, 0, 0, 30));
            g.rotate(0.2);

            // 间隔
            int split = fontSize * 2;
            // 文字占用的宽度
            int xWidth = getStrWidth(waterMarkName, fontSize);
            // x,y可以绘制的数量,多加一个补充空白
            int xCanNum = width / xWidth + 1;
            int yCanNum = height / fontSize + 1;
            for (int i = 1; i <= yCanNum; i++) {
                int y = fontSize * i + split * i;
                for (int j = 0; j < xCanNum; j++) {
                    int x = xWidth * j + split * j;
                    g.drawString(waterMarkName, x, y - (fontSize + split) * j);
                }
            }
            g.dispose();

            // 将新的BufferedImage对象写入ByteArrayOutputStream中
            ImageIO.write(newImage, fileSuffix, outputStream);

            // 返回新的InputStream对象
            return new ByteArrayInputStream(outputStream.toByteArray());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取字符串占用的宽度
     * <br>
     *
     * @param str      字符串
     * @param fontSize 文字大小
     * @return 字符串占用的宽度
     */
    public static int getStrWidth(String str, int fontSize) {
        char[] chars = str.toCharArray();
        int fontSize2 = fontSize / 2;

        int width = 0;

        for (char c : chars) {
            int len = String.valueOf(c).getBytes().length;
            // 汉字为3,其余1
            // 可能还有一些特殊字符占用2等等,统统计为汉字
            if (len != 1) {
                width += fontSize;
            } else {
                width += fontSize2;
            }
        }
        return width == 0 ? 1 : width;
    }

    /**
     * 下载图片到本地
     * @param imageUrl
     * @param path
     */
    private static void downloadImage(String imageUrl, String path){
        try{
            // 参数：网络图片地址
            URL url = new URL(imageUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            // 参数：图片保存位置
            File file = new File(path);
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            int d;
            while ((d = bis.read()) != -1) {
                bos.write(d);
            }
            bos.close();
            bis.close();
            System.out.println("结束！！！");
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public static void main(String args[]) throws IOException {

        InputStream inputStream = addWatermark("https://file.pbb2c.com/common-product/2024/01/10/d6309795fa8045cd86d6e8ff93ce98ce.jpg",
                "Shop7439238 Store");

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        reader.close();

//        File file = new File("D:\\d6309795fa8045cd86d6e8ff93ce98ce.jpg");
//        // 删除临时文件 TODO
//        if (file.exists()) {
//            boolean isDeleted = file.delete();
//
//            if (isDeleted) {
//                System.out.println("文件已成功删除！");
//            } else {
//                System.out.println("无法删除该文件。");
//            }
//        } else {
//            System.out.println("指定的文件不存在。");
//        }

    }

//    public static void main(String[] args) throws IOException {
//        // 读取原图片信息 得到文件（本地图片）
//        File srcImgFile = new File("D:\\1.jpg");
//        //将文件对象转化为图片对象
//        Image srcImg = ImageIO.read(srcImgFile);
//        //获取图片的宽
//        int srcImgWidth = srcImg.getWidth(null);
//        //获取图片的高
//        int srcImgHeight = srcImg.getHeight(null);
//        System.out.println("图片的宽:"+srcImgWidth);
//        System.out.println("图片的高:"+srcImgHeight);
//
//        //创建一个URL对象,获取网络图片的地址信息（网络图片）
//        //        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
//        //        //将URL对象输入流转化为图片对象 (url.openStream()方法，获得一个输入流)
//        //        Image srcImg = ImageIO.read(url.openStream());
//        //        //获取图片的宽
//        //        int srcImgWidth = srcImg.getWidth(null);
//        //        //获取图片的高
//        //        int srcImgHeight = srcImg.getHeight(null);
//        //        System.out.println("图片的宽:"+srcImgWidth);
//        //        System.out.println("图片的高:"+srcImgHeight);
//
//
//
//        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
//        // 加水印
//        //创建画笔
//        Graphics2D g = bufImg.createGraphics();
//        //绘制原始图片
//        g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//        //-------------------------文字水印 start----------------------------
//        //根据图片的背景设置水印颜色
//        g.setColor(new Color(255,255,255,128));
//        //设置字体  画笔字体样式为微软雅黑，加粗，文字大小为60pt
//        g.setFont(new Font("微软雅黑", Font.BOLD, 60));
//        String waterMarkContent="Shop25482545";
//        //设置水印的坐标(为原图片中间位置)
//        int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
//        int y=srcImgHeight / 2;
//        //画出水印 第一个参数是水印内容，第二个参数是x轴坐标，第三个参数是y轴坐标
//        g.drawString(waterMarkContent, x, y);
//        g.drawString(waterMarkContent, x/3, y/3);
//        g.drawString(waterMarkContent, x*5/3, y*5/3);
//        g.dispose();
//        //-------------------------文字水印 end----------------------------
//
//        //-------------------------图片水印 start----------------------------
////        // 水印文件
////        String waterMarkImage="F:/image/s.png";
////        Image srcWaterMark = ImageIO.read(new File(waterMarkImage));
////        //获取水印图片的宽度
////        int widthWaterMark= srcWaterMark.getWidth(null);
////        //获取水印图片的高度
////        int heightWaterMark = srcWaterMark.getHeight(null);
////        //设置 alpha 透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
////        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
////        //绘制水印图片  坐标为中间位置
////        g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
////                    (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
////        // 水印文件结束
////        g.dispose();
//        //-------------------------图片水印 end----------------------------
//
//        //待存储的地址
//        String tarImgPath="D:\\3.jpg";
//        // 输出图片
//        FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
//        ImageIO.write(bufImg, "jpg", outImgStream);
//        System.out.println("添加水印完成");
//        outImgStream.flush();
//        outImgStream.close();
//
//    }
}
